package com.example.note_project.util;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.WindowManager;
import android.widget.Toast;
import com.example.note_project.ui.activity.EditActivity;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class PicturePickUtils {
  public static final int CODE_SETHDIMG_ALNUM = 1;
  public static final int CODE_SETHDIMG_CAM = 2;
  public static final int CROP_IMG = 100;
  private static final int REQUEST_CODE_LOCAL =120 ;
  public File camImgFile = null;
  public File cropImgFile = null;

  public static void selectPicFromLocal(EditActivity editActivity, int i) {
    Intent intent;
    if (Build.VERSION.SDK_INT < 19) {
      intent = new Intent(Intent.ACTION_GET_CONTENT);
      intent.setType("image/*");

    } else {
      intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    }
    startActivityForResult(intent,REQUEST_CODE_LOCAL);
  }

  private static void startActivityForResult(Intent intent, int requestCodeLocal) {

  }

  public void gotoCam(Context context) {
    try {
      //获取当前系统的android版本号
      int currentApiVersion = android.os.Build.VERSION.SDK_INT;

      SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
      String str = dateFormat.format(new Date(System.currentTimeMillis()));

      //设置保存拍摄照片路径(DCIM/Camera/Modle_PictureWall_img_20170212_122223.jpg)
      //路径默认，若修改则不能保存照片
      camImgFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "/Camera/Modle_PictureWall_img_" + str + ".jpg");

      Uri outputImgUriFromCam = null;
      if (currentApiVersion < 24) {
        outputImgUriFromCam = Uri.fromFile(camImgFile);
      } else {
        ContentValues contentValues = new ContentValues(1);
        contentValues.put(MediaStore.Images.Media.DATA, camImgFile.getAbsolutePath());

        outputImgUriFromCam = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);

      }

      //跳转到照相机拍照
      Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      it.putExtra(MediaStore.EXTRA_OUTPUT, outputImgUriFromCam);

      ((Activity) context).startActivityForResult(it, CODE_SETHDIMG_CAM);
//        startActivityForResult(it,CODE_SETHDIMG_CAM);
    }catch (Exception e){
      Toast.makeText(context,"请开启摄像权限",Toast.LENGTH_SHORT).show();
    }
  }


  public void gotoAlbum(Context context) {
    Intent it = new Intent(Intent.ACTION_PICK,
      android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

    ((Activity) context).startActivityForResult(it, CODE_SETHDIMG_ALNUM);
//        startActivityForResult(it,CODE_SETHDIMG_ALNUM);
  }

  public void cropImg(Context context, boolean isFromCam, boolean isSetHd, Intent data, String fileName) {
    File inputFile = null;

    if (isFromCam) {
      inputFile = camImgFile;
    } else {
      Log.d("ImageUtil", "cropImg:图片数据： "+data.getData());
      inputFile = new File(getRealPathFromURI(context, data.getData()));
    }

    //设置保存路径名称
    cropImgFile = new File(context.getExternalFilesDir(fileName), String.valueOf(System.currentTimeMillis()));

    WindowManager manager = ((Activity) context).getWindowManager();
    DisplayMetrics outMetrics = new DisplayMetrics();
    manager.getDefaultDisplay().getMetrics(outMetrics);

    Intent it = new Intent("com.android.camera.action.CROP");
    it.setDataAndType(getImageContentUri(context, inputFile), "image/*");

    it.putExtra("output", Uri.fromFile(cropImgFile));
    it.putExtra("crop", "true");
    it .putExtra("scale",true);//黑边
    it .putExtra("scaleUpIfNeeded",true);//黑边


    if (isSetHd) {
      // 裁剪框比例
      it.putExtra("aspectX", 1);
      it.putExtra("aspectY", 1);

      // 输出图片大小
      it.putExtra("outputX", outMetrics.widthPixels / 2);
      it.putExtra("outputY", outMetrics.widthPixels / 2);
    } else {
      // 裁剪框比例
      it.putExtra("aspectX", 3);
      it.putExtra("aspectY", 2);

      // 输出图片大小
      it.putExtra("outputX", 600);
      it.putExtra("outputY", 400);
    }

    // 返回格式
    it.putExtra("outputFormat", "JPEG");

    ((Activity) context).startActivityForResult(it, CROP_IMG);
//        startActivityForResult(it, CROP_IMG);
  }

  public String getRealPathFromURI(Context context, Uri uri) {
    String mImgPath;
    String[] filePathColumn = {MediaStore.Images.Media.DATA};

    Cursor cursor = context.getContentResolver().query(uri, filePathColumn, null, null, null);
    if(cursor!=null){
      cursor.moveToFirst();
      int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
      String picturePath = cursor.getString(columnIndex);
      cursor.close();
      mImgPath=picturePath;
    }else{
      mImgPath=uri.getPath();
    }
    return mImgPath;



  }

  public Uri getImageContentUri(Context context, File imageFile) {
    String filePath = imageFile.getAbsolutePath();
    Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{"_id"}, "_data=? ", new String[]{filePath}, (String) null);
    if (cursor != null && cursor.moveToFirst()) {
      int values1 = cursor.getInt(cursor.getColumnIndex("_id"));
      Uri baseUri = Uri.parse("content://media/external/images/media");
      return Uri.withAppendedPath(baseUri, "" + values1);
    } else if (imageFile.exists()) {
      ContentValues values = new ContentValues();
      values.put("_data", filePath);
      return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    } else {
      return null;
    }
  }

  public void refreshAlbum(Context context, String path) {
    context.sendBroadcast(new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE", Uri.parse("file://" + path)));
  }


  public static byte[] bitmap2Bytes(Bitmap bm) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
    return baos.toByteArray();
  }

  /**
   * 根据byte数组生成文件
   *
   * @param bytes 生成文件用到的byte数组
   */
  public static boolean createFileWithByte(byte[] bytes) {
    String fileName = "portrait.png";


    // TODO Auto-generated method stub
    /**
     * 创建File对象，其中包含文件所在的目录以及文件的命名
     *
     */
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判断SDCard进行操作
      //获取SDCard指定目录下
      String sdCardDir = Environment.getExternalStorageDirectory() + "/CropImage/";
      File dirFile = new File(sdCardDir);//目录转换成文件夹
      if (!dirFile.exists()) {//如果不存在，就建立这个文件夹
        dirFile.mkdir();
      }
      File file = new File(sdCardDir, fileName);
      // 创建FileOutputStream对象
      FileOutputStream outputStream = null;
      // 创建BufferedOutputStream对象
      BufferedOutputStream bufferedOutputStream = null;
      try {
        // 如果文件存在则删除
        if (file.exists()) {
          file.delete();
        }
        // 在文件系统中根据路径创建一个新的空文件
        file.createNewFile();
        // 获取FileOutputStream对象
        outputStream = new FileOutputStream(file);
        // 获取BufferedOutputStream对象
        bufferedOutputStream = new BufferedOutputStream(outputStream);
        // 往文件所在的缓冲输出流中写byte数据
        bufferedOutputStream.write(bytes);
        // 刷出缓冲输出流，该步很关键，要是不执行flush()方法，那么文件的内容是空的。
        bufferedOutputStream.flush();
      } catch (Exception e) {
        // 打印异常信息
        e.printStackTrace();
      } finally {
        // 关闭创建的流对象
        if (outputStream != null) {
          try {
            outputStream.close();
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
        if (bufferedOutputStream != null) {
          try {
            bufferedOutputStream.close();
          } catch (Exception e2) {
            e2.printStackTrace();
          }
        }
      }
      return true;
    }
    return false;

  }

  /**
   * 获取文件路径并转换成Bitmap
   *
   * @param filepath
   * @return
   */
  public static Bitmap getFilePath(String filepath) {
    File file = new File(filepath);
    Bitmap bm = null;
    if (file.exists()) {
      bm = BitmapFactory.decodeFile(filepath);
    }
    return bm;
  }

  public static Bitmap Bytes2Bitmap(byte[] bytes) {
    if (bytes.length != 0) {
      return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    } else {
      return null;
    }
  }

  public static Bitmap toRoundCorner(Bitmap bitmap, float ratio) {//把正方形图片转化为圆形，ratio为2
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
      bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(output);
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    final RectF rectF = new RectF(rect);
    paint.setAntiAlias(true);
    canvas.drawARGB(0, 0, 0, 0);
    canvas.drawRoundRect(rectF, bitmap.getWidth() / ratio,
      bitmap.getHeight() / ratio, paint);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(bitmap, rect, rect, paint);
    return output;

  }

  public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {
    int w = bitmap.getWidth();
    int h = bitmap.getHeight();
    Matrix matrix = new Matrix();
    float scaleWidth = ((float) width / w);
    float scaleHeight = ((float) height / h);
    matrix.postScale(scaleWidth, scaleHeight);
    Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
    return newbmp;
  }


  public static String savePhotoToSDCard(Bitmap bitmap) {
    String photoName = "";
    if (checkSDCardAvailable()) {
      // 图片时间命名
      SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
      Date date = new Date(System.currentTimeMillis());
      photoName = format.format(date);
      // 存储至DCIM文件夹下
      File dir = new File(Environment
        .getExternalStorageDirectory() + "/Stw/temp/save/");
      if (!dir.exists()) {
        dir.mkdirs();
      }

      File photoFile = new File(dir.getAbsolutePath(), photoName + ".png");
      Bitmap photoBitmap = bitmap;
//            FileOutputStream fileOutputStream = null;
//            try {
//                fileOutputStream = new FileOutputStream(photoFile);
      if (photoBitmap != null) {
//                    double maxSize = 400.00;
        // 将bitmap放至数组中，意在bitmap的大小（与实际读取的原文件要大）
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        photoBitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos);
        int options = 80;//先压缩到80%
        while (baos.toByteArray().length / 1024 > 200) { // 循环判断如果压缩后图片是否大于200kb,大于继续压缩
          if (options <= 0) {//有的图片过大，可能当options小于或者等于0时，它的大小还是大于目标大小，于是就会发生异常，异常的原因是options超过规定值。所以此处需要判断一下
            break;
          }
          baos.reset();// 重置baos即清空baos
          options -= 10;// 每次都减少10
          bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);
        }
//                    byte[] b = baos.toByteArray();
//                    // 将字节换成KB
//                    double mid = b.length / 1024;
//                    // 判断bitmap占用空间是否大于允许空间 如果大于则压小于则不压缩
//                    if (mid > maxSize) {
//                        // 获取bitmap大小 是允许最大大小的多少
//                        double i = mid / maxSize;
//                        // 压缩 此处用到平方将宽带和高度压缩掉对应的平方根
//                        // 保持刻度和高度和原bitmap比率，压缩后也达到了大小占用空间的大小）
//                        photoBitmap = zoomImage(photoBitmap,
//                                photoBitmap.getWidth() / Math.sqrt(i),
//                                photoBitmap.getHeight() / Math.sqrt(i));
//                    }
//                    if (photoBitmap.compress(Bitmap.CompressFormat.PNG, 100,
//                            fileOutputStream)) {
//                        fileOutputStream.flush();
//                        // fileOutputStream.close();
//                    }
        try {
          FileOutputStream fos = new FileOutputStream(photoFile);
          fos.write(baos.toByteArray());
          fos.close();
          baos.close();
          return photoFile.getAbsolutePath();
        } catch (Exception e) {

        }


      }
//            } catch (FileNotFoundException e) {
//                photoFile.delete();
//                e.printStackTrace();
//            } catch (IOException e) {
//                photoFile.delete();
//                e.printStackTrace();
//            } finally {
//                try {
//                    if (fileOutputStream != null) {
//                        fileOutputStream.close();
//                    }
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }

    }

    return null;
  }

  /**
   * 压缩图片
   */
  public static Bitmap zoomImage(Bitmap bgimage, double newWidth,
                                 double newHeight) {
    // 获取这个图片的宽和高
    float width = bgimage.getWidth();
    float height = bgimage.getHeight();
    // 创建操作图片用的matrix对象
    Matrix matrix = new Matrix();
    // 计算宽高缩放�?
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    // 缩放图片动作
    matrix.postScale(scaleWidth, scaleHeight);
    Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width,
      (int) height, matrix, true);
    return bitmap;
  }

  //检查sd卡是否存在
  public static boolean checkSDCardAvailable() {
    return Environment.getExternalStorageState().equals(
      Environment.MEDIA_MOUNTED);
  }


}
